在从事Python程序员工作的初期,我们所有人都在代码中遇到了各种类型的错误,而在StackOverflow痛苦的几个小时之后,这些错误不是错误,而是Python的功能。 以下是大多数新Python程序员犯的5个最常见的错误。 让我们找出一些有关它们的信息,以便通过在Facebook上的页面和群组中提问来节省几个小时。
1.复制字典或列表
当您需要复制字典或列表时,仅使用赋值运算符是不够的。
错误:>>> dict_a = {"name": "John", "address":"221B Baker street"} >>> dict_b = dict_a
现在,如果您更改或更新了dict_b,那么dict_a也将被更改-这一切都要归功于赋值运算符。 使用此运算符,您试图说dict_b将指向与dict_a相同的对象。
>>> dict_b["age"] = 26 >>> dict_b {'address': '221B Baker street', 'name': 'John', 'age': 26} >>> dict_a {'address': '221B Baker street', 'name': 'John', 'age': 26} >>>
正确:使用copy()或deepcopy()方法。
>>> dict_c = dict_b.copy() >>> dict_c["location"] = "somewhere" >>> dict_c {'address': '221B Baker street', 'name': 'John', 'age': 26, 'location': 'somewhere'} >>> dict_b {'address': '221B Baker street', 'name': 'John', 'age': 26} >>> dict_a {'address': '221B Baker street', 'name': 'John', 'age': 26} >>>
查看复制和深度复制之间的区别。2.字典键
让我们尝试将值添加到字典中:
>>> dict_a = dict() >>> dict_a {} >>> dict_a[1] = "apple" >>> dict_a[True] = "mango" >>> dict_a[2] = "melon"
如果我们尝试在屏幕上显示字典,我们会看到什么?
>>> dict_a {1: 'mango', 2: 'melon'}
发生了什么,True键在哪里?
必须记住,布尔类继承自Integer(整数)。 等于True的整数是1; False等效项为0。因此,密钥1的值将被简单地覆盖。
>>> isinstance(True, int) True >>> isinstance(False, int) True >>> True == 1 True >>> False == 0 True
3.更新列表或词典
假设您要将一个项目添加到列表中。
>>> list_a = [1,2,3,4,5] >>> list_a = list_a.append(6) >>> list_a >>>
或尝试更新字典。
>>> dict_a = {"a" : "b"} >>> dict_a = dict_a.update({"c" : "d"}) >>> dict_a >>>
现在,让我们尝试排列列表。
>>> list_b = [2,5,3,1,7] >>> list_b = list_b.sort() >>> list_b >>>
为什么什么都不出来,我们在做什么错呢?
大多数容器方法(例如排序,更新,追加,添加等)均出于性能目的进行了优化-避免不必要地创建单独的副本。
不要尝试将此类方法的返回值分配给变量。
正确地: >>> list_a = [1,2,3,4,5] >>> list_a.append(6) >>> dict_a = {"a" : "b"} >>> dict_a.update({"c" : "d"}) >>> dict_a {'c': 'd', 'a': 'b'} >>> list_a.sort() >>> list_a [1, 2, 3, 4, 5, 6]
4.实习弦
在某些情况下,Python尝试重用现有的不可变对象。 字符串实习就是这样一种情况。
>>> a = "gmail" >>> b = "gmail" >>> a is b True
在这里,我们尝试创建两个不同的对象-字符串。 但是,当我们测试它们的等效性时,事实证明它们完全重合。 这是因为Python并未创建另一个对象b,而是使b指向“ gmail”的第一个值。
所有长度为1的字符串都被屏蔽。 除ASCII字符,数字和下划线以外的行将不会被插入。
让我们来看看。
>>> a = "@gmail" >>> b = "@gmail" >>> a is b False
还请记住,==与is运算符不同。 ==运算符检查值是否相等,而is运算符检查两个变量是否引用同一对象。
>>> a = "@gmail" >>> b = "@gmail" >>> a is b False >>> a == b True
因此,在使用不可变字符串或==和is运算符时,请记住这一点。
5.默认参数评估一次。
考虑一个例子:
def func(a, lst=[]): lst.append(a) return lst print(func(1)) print(func(2))
您认为两次打印后会显示什么?
让我们运行代码。
>>> def func(a, lst=[]): ... lst.append(a) ... return lst ... >>> print(func(1)) [1] >>> print(func(2)) [1, 2]
为什么第二种情况输出[1、2]? 不应该只是[2]吗?
因此,问题在于默认参数仅被评估一次,第一次调用该函数func(1)时,该列表被评估并意识到它为空。 这意味着您可以添加1。但是在第二个调用-func(2)上,列表中已经有一个元素,因此显示[1、2]。
奖励:无需混合空格和制表符。 只是不要。