Python 有什么不为人知的坑?

发布时间:
2024-09-09 09:12
阅读量:
42

有啊,比如很著名的地址赋值:

>>> a = [[2] * 5] * 3 >>> a [[2, 2, 2, 2, 2], [2, 2, 2, 2, 2], [2, 2, 2, 2, 2]] >>> a[2][2] = 1 >>> a [[2, 2, 1, 2, 2], [2, 2, 1, 2, 2], [2, 2, 1, 2, 2]] >>>


这是因为当你赋值时变量存储的是内容地址,而不是真正的内容


还有,在存储字符串时,如果字符串里面有反斜杠“\”,那么会导致字符串不正确存储,甚至导致错误,比如:

>>> path = "C:\Users\admin" File "<stdin>", line 1 path = "C:\Users\admin" ^^^^^^^^^^^^^^^^ SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape >>>

其实这个错误很好解决,只需要:

>>> path = r"C:\Users\admin" >>>

加上字符串前缀 r 即可


再比如,很多人一上手就想改编字符串指定索引的值:

>>> a = "hello" >>> a[3] = "a" Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'str' object does not support item assignment >>>

其实 str 并不支持根据指定索引赋值

再深入的讲就是 str 没有 __setitem__ 方法:

>>> hasattr(str, "__setitem__") False >>>

根据指定索引赋值的正确实现是:先转成列表,然后转成字符串:

>>> a = "hello" >>> a = list(a) >>> a ['h', 'e', 'l', 'l', 'o'] >>> a[3] = "a" >>> print("".join(a)) helao >>>


冷知识,最后的输出可以改成:

>>> print(*a,sep="") helao >>>



其实很多人都提到了,将函数传入参数时,不需要调用函数,即加上括号。比如:

def func(timestamp=time.time()): print(timestamp)

这个是错的

import tkinter as tk root = tk.Tk() def on_button_click(): print("按钮被点击了!") button = tk.Button(root, text="点击我", command=on_button_click()) root.mainloop()

这个也是错的

这是因为传入的参数应该是函数的引用,而不是函数的返回值

END