python导入txt时wrongformat_Python里的那些坑

不要在对象的init函数之外初始化类属性,主要有两个问题

如果类属性更改,则初始值更改。

如果将可变对象设置为默认值,您将获得跨实例共享的相同对象。

错误示范(除非你想要静态变量)

class Car(object):

color = "red"

wheels = [Wheel(), Wheel(), Wheel(), Wheel()]

正确的做法:

class Car(object):

def __init__(self):

self.color = "red"

self.wheels = [Wheel(), Wheel(), Wheel(), Wheel()]

函数默认参数

def foo(li=[]):

li.append(1)

print(li)

foo([2])

# Out: [2, 1]

foo([3])

# Out: [3, 1]

该代码的行为与预期的一样,但如果我们不传递参数呢?

foo()

# Out: [1] As expected...

foo()

# Out: [1, 1] Not as expected...

这是因为函数参数类型是定义是确认的而不是运行时,所以在两次函数调用时,li指向的是同一个list对象,如果要解决这个问题,可以这样:

def foo(li=None):

if not li:

li = []

li.append(1)

print(li)

foo()

# Out: [1]

foo()

# Out: [1]

这虽然解决了上述的问题,但,其他的一些对象,比如零长度的字符串,输出的结果就不是我们想要的。

x = []

foo(li=x)

# Out: [1]

foo(li="")

# Out: [1]

foo(li=0)

# Out: [1]

最常用的办法是检查参数是不是None

def foo(li=None):

if li is None:

li = []

li.append(1)

print(li)

foo()

# Out: [1]

在遍历时修改

for语句在遍历对象是会生成一个迭代器,如果你在遍历的过程中修改对象,会产生意想不到的结果:

alist = [0, 1, 2]

for index, value in enumerate(alist):

alist.pop(index)

print(alist)

# Out: [1]

第二个元素没有被删除,因为迭代按顺序遍历索引。上述循环遍历两次,结果如下:

# Iteration #1

index = 0

alist = [0, 1, 2]

alist.pop(0) # removes '0'

# Iteration #2

index = 1

alist = [1, 2]

alist.pop(1) # removes '2'

# loop terminates, but alist is not empty:

alist = [1]

如果避免这个问题了,可以创建另外一个list

alist = [1,2,3,4,5,6,7]

for index, item in reversed(list(enumerate(alist))):

# delete all even items

if item % 2 == 0:

alist.pop(index)

print(alist)

# Out: [1, 3, 5, 7]

整数和字符串定义

python预先缓存了一个区间的整数用来减少内存的操作,但也正是如此,有时候会出很奇特的错误,例如:

>>> -8 is (-7 - 1)

False

>>> -3 is (-2 - 1)

True

另外一个例子

>>> (255 + 1) is (255 + 1)

True

>>> (256 + 1) is (256 + 1)

False

通过不断的测试,会发现(-3,256)这区间的整数都返回True,有的甚至是(-8,257)。默认情况下,[-5,256]会在解释器第一次启动时创建并缓存,所以才会有上面的奇怪的行为。这是个很常见但很容易被忽略的一个坑。解决方案是始终使用equality(==)运算符而不是 identity(is)运算符比较值。

Python还保留对常用字符串的引用,并且可以在比较is字符串的身份(即使用)时产生类似的混淆行为。

>>> 'python' is 'py' + 'thon'

True

python字符串被缓存了,所有python字符串都是该对象的引用,对于不常见的字符串,即使字符串相等,比较身份也会失败。

>>> 'this is not a common string' is 'this is not' + ' a common string'

False

>>> 'this is not a common string' == 'this is not' + ' a common string'

True

所以,就像整数规则一样,总是使用equal(==)运算符而不是 identity(is)运算符比较字符串值。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值