python平时使用中容易犯错误的地方:
1. 不要在遍历中去删除元素
有时候我们需要遍历处理,在处理完一个元素获得结果后进行删除,免得下次会重复处理浪费时间
s = list('我是谁,我在哪里?')
for i in s:
print(i, end="")
s.remove(i)
输出
我谁我哪?
但是要注意从前往后删除,元素索引也会依次前移,导致结果不是你想过要的,
尝试解决
如果你能保证其元素不会重复度,可以试着从后往前遍历
s = list('我是谁,在哪里?')
for i in s[::-1]:
print(i, end="")
s.remove(i)
print(s)
但当不能保证元素的唯一性时,最好是另外深拷贝一份做遍历
2. 不要使用 *创建可变量列表
使用 *创建列表穿件的列表地址是同一个
# 时间限制
Label(win1, text='时间设置:').grid(row=0, column=2)
values = ["3", "6", "12", '18', '24', '36', '48']
times = [IntVar()] * len(values)
for i in range(len(values)):
Checkbutton(win1, text=values[i], variable=times[i]).grid(row=i + 1, column=2, padx=20)
for i in times:
print(id(i))
Button(win1, text="修改", command=lambda: set_value(games, times)).grid(row=10, column=3, padx=20)
如上代码, 使用tk本来意愿是多个选项各自获取其属性,但是这样生成的列表最终所有值都指向同一个地址,修改任意一个Checkbutton其他全部会改变
输出ID:
1841798242200
1841798242200
1841798242200
1841798242200
1841798242200
1841798242200
1841798242200
3.函数参数传递后重新指向不会改变原参数内容
Python的函数参数传递是将引用对象地址的一份复制赋值给形参
若在函数内改变形参的指向(即对形参重新赋值),则不会影响原指向内存的内容
但是如果只是改变其内部值,实际是改变原指向地址的内容
a = [1, 2, 3]
def change(a):
a = [4, 5]
print("change:", a)
def change1(a):
a[3:3] = [4, 5]
print("change1:", a)
print("befor change:", a)
change(a)
print("after change:", a)
change1(a)
print("after change1:", a)
输出
befor change: [1, 2, 3]
change: [4, 5]
after change: [1, 2, 3]
change1: [1, 2, 3, 4, 5]
after change1: [1, 2, 3, 4, 5]
4. 类中单下划线和双下划线
- 1、在一个模块中,单下划线开头的变量和函数被默认当中内部私有成员,当使用from a_module import * 时,这些变量和函数不会被导入,但如果使用import a_module导入时,仍然可以用a_module._var访问
- 2、如果类成员使用双下划线开头命名,则Python会自动将其名称改为_classname__var,这是为了避免该成员的名称与子类中的名称冲突
- 3、而类似于__init__为Python具有特别含义的标识符,Python 官方推荐永远不要将这样的命名方式应用于自己的变量或函数
具体可以参考:Python 的类的下划线命名有什么不同
参考:https://blog.youkuaiyun.com/scutjyj/article/details/75196319