python - 小知识 易错点

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.csdn.net/scutjyj/article/details/75196319

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值