我的python学习笔记
(此文是在实际工程中遇到的一些小问题,给予解决和整理。解决方法大多来自网上零散的文章。)
1——如下代码,
a=[1,2,3]
b=a
b也是[1,2,3]了,接着
a[0]=4 a[1]=5 a[2]=6
此时a变成[4,5,6]了,再看b,a变了之后没有对b进行新的引用,但b还是变了,自动的也变成[4,5,6]了。
除非对a进行新的赋值,比如
>>>a=[7,8,9] >>>a >>>[7,8,9] >>>b >>>[4,5,6]
这是因为列表被定义为是可变类型,相对的是不可变类型。如Python文档所示:
12
3
可以看到,不可变类型只有:数字,字符串,元组。其它的类型都是可以在名字不变的情况下,对其内容进行修改,并且会影响到其他引用它的变量。
再比如:
>>>a=[1] >>>c=[] >>>c.append(a)
>>>c [[1]] >>>a.append(2) >>>c [[1,2]]
1.1——父作用域属性不会影响到子作用域。
>>> a = 0 >>> a = [1] >>> c = (a) >>> type(c) list >>> c = (a, 1) >>> type(c) tuple >>> a.append(2) >>> c ([1, 2], 1)
即元组不可变,但其内部的可变类型,如列表,可以随时改变
2——当你需要引用一个数组的其中一部分,而此数组的长度是不确定的,导致你有可能引用的范围超过了它的长度,可以在引用范围中加上一个冒号:
a_list = [] #此两行代码是正确的,不会报错
b_list = a_list[-1:] #比如-1后面的冒号
此时如果使用b_list=a_list[-1],程序会报错,“IndexError: list index out of range”;再比如
a_list 的长度随着程序的运行会变化,有可能是长3,也有可能变成5个元素,但必须保证b_list不能包含a_list的后面四个元素,
此时可以使用
b_list = a_list[:-4]
这样,即使a_list==[1,2,3],b_list也能成功引用,结果是b_list==[] 。
3——参数前加上单星号或双星号
4——改变对象值的方法是没有返回值的。比如
>>list_2 = list_1.reverse() >>print(type(list_2)) >>NoneType
>> >>list_2 = list_1.remove(n) >>print(type(list_2)) >>NoneType >>
5——max函数可加入参数key,
d = {'9':1, '11':1} max(d) >>
6--json会把字典的数字键改为str
7____python中有两个判断语句:==,is
不能混用,==用来比较变量的值是否相等,is 用来判断变量的内存地址是否一样
tuple_1 = ("a",) tuple_2 = ("a",) print("tuple_1 == tuple_2:\n", tuple_1 == tuple_2) print("id(tuple_1) == id(tuple_2):\n", id(tuple_1) == id(tuple_2)) print("tuple_1 is tuple_2:\n", tuple_1 is tuple_2) print("tuple_1[0] == tuple_1[0]:\n", tuple_1[0] == tuple_1[0]) print("id(tuple_1[0]) == id(tuple_2[0]):\n", id(tuple_1[0]) == id(tuple_2[0])) print("tuple_1[0] is tuple_1[0]:\n", tuple_1[0] is tuple_1[0])
输出:
tuple_1 == tuple_2: True id(tuple_1) == id(tuple_2): False tuple_1 is tuple_2: False tuple_1[0] == tuple_1[0]: True id(tuple_1[0]) == id(tuple_2[0]): True tuple_1[0] is tuple_1[0]: True
可以这么说:
is 是 == 的子集。
参考:https://www.cnblogs.com/CheeseZH/p/5260560.html