1
这个错误是我在百度贴吧里找到的,下面的图片是发帖人的图片

运行程序,一定会报语法错误,不同于其他错误,语法错误不会具体告诉你哪里不对,但语法错误其实也很好解决。
首先,语法错误在pycharm这样的编辑器里,会有明显的提示,就像上面的这段代码,已经出现了红色的波浪线,那么,这里一定是有问题的。
我回答这个问题,不是为了让你知道编辑器有这样的功能,而是要强调一个编程语言的概念--数据类型。
程序=数据+算法。对于初学者,算法的学习和精进是一个长期的过程,并且难度不小,但数据对你来说,是花点功夫就可以掌握的。
不论哪门语言,都有标准数据类型,而且大同小异,就python而言,也就是int, float, str, bool,list, tuple, set, dict。 写程序,不是堆砌代码,你得知道你程序里的每一个变量的数据类型是什么,不然,你如何操作这个变量,一个变量的数据类型如果是list,你才能使用append方法,如果变量的类型是set,那么,你就只能用add方法来添加元素。
这个初学者的问题,不在于他不知道编辑器里出现红色波浪线的提示作用,而在于,他根本没有清晰的数据概念,他没有意识到,程序是在处理数据,而每一个数据都是有类型的,如果他能意识到数据是有类型的,那么程序出错的地方 ./demo.docx 的类型是什么呢? 什么都不是,如果是字符串,必须用单引号或者双引号围起来。
初学者很喜欢狡辩说这是细节,没有注意,我认为这只是表面原因,根本原因,还没有建立起数据类型这个概念,在初学阶段,你应该强迫自己,去辨识每一个变量的类型是什么。
1
先来看一段代码
a = 5
b = a
a = 8
print(b)
程序执行结果为 5
再来看第二段代码
a = [1,2]
b = a
a.append(3)
print(b)
程序执行结果是[1, 2, 3]
这是两段很容易让初学者感到疑惑的代码,要想真正理解这两段代码,你必须先理解变量的引用概念。简单来说,变量是数据的引用,换一个说法,内存里有数据,变量只是指向了数据而已。

先看第一段代码
b=a ,这行代码执行时,内存中并没有增加数据,仍然只有一个数据,这个数据就是5, 此时有两个变量,分别是a和b,a指向了5,b=a,是浅拷贝,b也指向了5。
之后执行a = 8,这个时候,内存里创建了数据8,a指向了8,而b仍然指向5,所以print(b) 的结果是5。
再来看第二段代码
a和b都指向了内存的一个数据[1,2],执行a.append(3)时,并没有改变a的指向,而是修改了数据的内容,列表是可变对象。a指向的数据内容发生了变化,b也指向这个数据,所以print(b) 的结果是[1,23]。如何才能实现第一段代码那样的结果呢?很简单,对a进行赋值操作即可,看下面的代码
a = [1,2]
b = a
a = [1,2]
a.append(3)
print(b)
print(a)
程序的输出结果是
[1, 2]
[1, 2, 3]
记住,只有赋值操作,也就是等号(=)才能改变一个变量的指向。

下面的代码,演示如何实现深拷贝
import copy
a = [1,2]
b = copy.deepcopy(a)
a.append(3)
print(b)
deepcopy实现了深拷贝,它在内存中创建了一个和[1,2]一模一样的数据,然后赋值给b,此时,内存中有两个[1,2],存储在不同的位置,a和b分别指向他们,这时,你对a变量进行的任何操作都不会影响到b,因为,他们根本就不是同一个数据。




