python误区

序列递减

for x in range(4):
    print(x)

# 0,1,2,3

for x in range(3,-1,-1):
    print(x)
# 3,2,1,0

倒序的range为左边包括,右边未到

元素重复

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

>>> a[0][1] = 8
[[1,8], [1,8], [1,8]]

# itertools.repeat 生成的也是同理
[[]] 里面的list为同一个指向目标(地址相同)

>> id(a[0]) == id(a[1])
True

如果想生成一个list内元素不一样的list,需要如下

[[1,2] for _ in range(3)]

相当于deep copy 和 copy的区别

Boolisinstance的判断

问题:

isinstance(True, (float, int))
True

原因:

由于历史原因,bool是int的子类,True + 1会等于 2

int.__subclasses__()
[bool,
 <enum 'IntEnum'>,
 <enum 'IntFlag'>,
 sre_constants._NamedIntConstant,
 subprocess.Handle]

如果需要准确判断boolint,需要在判断int之前,判断bool

if isinstance(sth, bool):
    # do sth.
elif isinstance(sth, int):
    # other thing.

或者使用type准确判断类型

if type(sth) in (float, int):
    # do stuff.

默认参数的值应该是不可变对象

如果

def spam(a, b=[]):
    print(b)
    return b

x = spam(1)
# x:[]
x.append(99)
# x:[99]
spam(1)
# [99]

会被改变

因此要设置成不可变对象,如NoneTrueFalse数字或字符串等


PythonNotes

117 Words

创建于 2020-11-10 17:49 +0800

修改于 2020-11-10 17:49 +0800