0x05
In [24]: row = [''] * 3 In [25]: table = [row] * 3 In [26]: table Out[26]: [['', '', ''], ['', '', ''], ['', '', '']] In [27]: table[0][0] = 'python' In [28]: table Out[28]: [['python', '', ''], ['python', '', ''], ['python', '', '']]
这是因为通过乘法初始化 table 时,每个 item 也就是 table[0]、table[1]、table[2] 在内存中引用的都是同一个列表。
0x06
In [29]: a = 256 In [30]: b = 256 In [31]: a is b Out[31]: True In [32]: a = 257 In [33]: b = 257 In [34]: a is b Out[34]: False
产生这种现象的根本原因就是 256 是一个已经存在的对象而 257 不是,事实上当 Python 启动时数值为 -5 到 256 这些常用的的对象就已经被分配好了。
0x07
In [37]: 'something' is not None Out[37]: True In [38]: 'something' is (not None) Out[38]: False
这是因为 is not
是一个单独的二元运算符,如果运算符两侧的变量指向同一个对象, 则 is not
的结果为 False
, 否则为 True
。
0x08
In [47]: a = [1, 2, 3, 4] In [48]: b = a In [49]: a = a + [5, 6, 7, 8] In [50]: a Out[50]: [1, 2, 3, 4, 5, 6, 7, 8] In [51]: b Out[51]: [1, 2, 3, 4]
In [52]: a = [1, 2, 3, 4] In [53]: b = a In [54]: a += [5, 6, 7, 8] In [55]: a Out[55]: [1, 2, 3, 4, 5, 6, 7, 8] In [56]: b Out[56]: [1, 2, 3, 4, 5, 6, 7, 8]
在第一个例子中 a = a + ...
会生成一个新的列表然后 a 指向这个列表,但 b 是保持不变的。
而第二个例子中的 a += ...
实际上是使用的是 extend
函数,所以 a 和 b 指向的都是同一个列表。
0x09
t = ('one', 'two') for i in t: print(i) print('*'*5) t = ('one') for i in t: print(i) print('*'*5) t = () print(t) ## 输出 one two o n e tuple()
在 Python 的世界 ()
是一个特殊的标记,表示空元组,这个非常容易理解。
而 t = ('one')
或者 t = 'one'
都是会被解释成为字符串的。正确的写法应该是 t = ('one',)
。
总结
今天派森酱带领大家整理了一些 Python 中比较好玩有趣的代码,觉得眼前一亮的同时还可以顺带更深刻的理解 Python 的设计思想,一举两得。
小伙伴们还遇到过哪些匪夷所思的代码呢,可以评论区一起分享一波哦~