Python std.stdout.write循环问题

时间:2011-04-14 15:34:39

标签: python python-3.x

我不确定这里发生了什么,但我有一些python代码:

import sys

max_cols = 350
max_rows = 1
r1 = range(max_rows)
r2 = range(max_cols)

for y in r1:
    for x in r2:
        sys.stdout.write('something')
        if x is not max_cols-1:
            sys.stdout.write(',')

现在,这适用于max_cols< = 257的值。 但是,如果您使用> = 258,最后会得到额外的','。 (这里的想法显然是生成一个CSV文件。)

现在,256是一个CS编号,因此这里显然有一些我不知道的事情,因为在此之前一切都完美无缺。当我尝试使用相同的模式写入文件时也会发生这种情况。

为什么会这样?

使用Python 3.2。

2 个答案:

答案 0 :(得分:5)

is 用于检查相等性,但用于检查身份。 x is y仅在两个变量引用同一对象时才为真。碰巧,CPython重用小整数的对象 - 但一般来说,身份的概念与平等概念有很大的不同。分别使用正确的运算符==!=来表示相等和不等式,它可以正常工作。

另请注意,只需使用csv module即可使代码更简单,更健壮。无需重新发明轮子。

答案 1 :(得分:2)

CPython实现缓存小数字,因此数字12的所有实例都是同一个对象。 is运算符会比较对象的标识,而不是它们的值。您想要做的是使用!=运算符来比较值。

您的CPython实现实例可能会缓存最多256个数字。

顺便提一下,每当你碰到这样的模式时,你必须从分隔的事物列表中删除最后一个分隔符,str.join可能是你想要的。