5个常见的初学者Python错误

在从事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 >>> # prints nothing 

或尝试更新字典。

 >>> dict_a = {"a" : "b"} >>> dict_a = dict_a.update({"c" : "d"}) >>> dict_a >>> # prints nothing 

现在,让我们尝试排列列表。

 >>> list_b = [2,5,3,1,7] >>> list_b = list_b.sort() >>> list_b >>> # prints nothing 

为什么什么都不出来,我们在做什么错呢?

大多数容器方法(例如排序,更新,追加,添加等)均出于性能目的进行了优化-避免不必要地创建单独的副本。

不要尝试将此类方法的返回值分配给变量。

正确地:

 >>> 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]。

奖励:无需混合空格和制表符。 只是不要。

Source: https://habr.com/ru/post/zh-CN458902/


All Articles