>>> a = 1 >>> b = a >>> a = 3 >>> print(b) 1 b的值为1,不是3,没有改变。int、str、tuple都是不可变的;set、list、dict是可变的。 >>> a = [1,2,3,4,5] >>> b = a >>> a[0] = '1' >>> print(a) ['1', 2, 3, 4, 5] >>> print(b) ['1', 2, 3, 4, 5] 在这里列表第一个元素改变了,为什么?int类型和list是截然不同的额,int称为值类型,list是引用类型,它们的区别:类似于java中的基本数据类型和引用类型,
>>> a = "hello" >>> a = a + "world" >>> print(a) helloworld 字符串不是不可变的么?这里a怎么貌似从"hello"变成了"helloworld"。实际上不是,a = a + "world"生成了一个新的字符串,我们再看python的一个函数 id(),用于显示某一个变量在内存的地址。 >>> b = "hello" >>> id(b) 1979272160456 >>> b = b + "python" >>> id(b) 1979272322480 可以看到两次调用id方法b的地址是不同的,这就说明生成了一个行的字符串。再看: >> 'python'[0] 'p' >>> 'python'[0]='o' Traceback (most recent call last): File "<pyshell#40>", line 1, in <module> 'python'[0]='o' TypeError: 'str' object does not support item assignment 这里就报错了,错误信息显示str是不可变的。
>>> type = 1 >>> type(1) Traceback (most recent call last): File "<pyshell#29>", line 1, in <module> type(1) TypeError: 'int' object is not callable 报错,因为type已经是一个变量了,不能使用type(1)作为函数调用,所以尽量不要用type来命名变量,同样print也不要用来当变量名。
>>> a = 'hello' >>> b = 'hello' >>> a is b True >>> a = 1 >>> b = 2 >>> a is b False
>>> a = 1 >>> b = 1 >>> a is b True >>> a == b True >>> a = 1 >>> b = 1.0 >>> a==b True >>> a=1 >>> b = 1.0 >>> a is b False //关系运算符(==)比较的是值是否相等,is不是比较值,比较的是两个变量身份是否相等(内存地址是否相等)。 >>> a = 1 >>> b = 1.0 >>> id (a) 1799908384 >>> id(b) 2825402717672 >>> a == b True >>> a is b False //地址值不同,所以is返回False,== 返回True。 //集合的运算 >>> a = {1,2,3} >>> b = {2,1,3} >>> a == b True >>> a is b False
//元组的运算 >>> c = (1,2,3) >>> d = (2,1,3) >>> c == d False >>> c is d False >>> id(a) 2026157550504 >>> id(b) 2026157966056 //分析:集合和元组不同,集合是无序的,{1,2,3}和{2,1,3}, == 是比较值,所以相等;is比较内存地址,所以返回False。而元组是有序的,做值的比较返回时False。