Python有两种内置的或是已经定义过的类型。
可变类型是指那些内容允许实时变更的,典型的可变类型是列表和字典:所有的列表(List)都有可变的方法比如list.append() or list.pop(),并且可以在适当的地方更改。字典和列表拥有一样的特点。
不可变类型不提供变更内容的方法。比如,变量x被置为6,它没有增长的方法。如果你需要加1,你需要创建一个新的对象。
my_list = [1, 2, 3]
my_list[0] = 4
print my_list # [4, 2, 3] <- The same list as changed
x=6
x=x+1 #Thenewxisanotherobject
这种区别的结果之一就是可变类型不是稳定的,因此它们不能作为字典的key。
对可变的对象使用可变类型,对不可变的对象使用不可变类型,有助于澄清代码的意图。
例如,不可变的列表对应的就是元组。创建一个(1,2)的元组。元组创建以后就不能再更改,并且可以作为字典的键。
让新手较为惊讶的Python的特点之一是 string是种不可变的数据类型。这意味着连接一个string的各个部分时,构造一个可变的list将会使比较效率的做法,然后用join方法把各个部分粘合在一起。需要注意的是,列表生成器比循环调用append()方法要更加的效率。
Bad
# create a concatenated string from 0 to 19 (e.g. "012..1819")
nums = ""
for n in range(20):
nums += str(n) # slow and inefficient
print nums
Good
# create a concatenated string from 0 to 19 (e.g. "012..1819")
nums = []
for n in range(20):
nums.append(str(n))
print "".join(nums) # much more efficient
Best
# create a concatenated string from 0 to 19 (e.g. "012..1819")
nums = [str(n) for n in range(20)]
print "".join(nums)
foo = ’foo’ bar = ’bar’
foobar = foo + bar # This is good
foo += ’ooo’ # This is bad, instead you should do:foo = ’’.join([foo, ’ooo’])
注意:除了join方法你也可以用格式化字符串来连接定义好的字符串,但是在Python3中%操作符将会被str.format()替代。
foo = ’foo’ bar = ’bar’
foobar = ’%s%s’ % (foo, bar) # It is OK
foobar = ’{0}{1}’.format(foo, bar) # It is better
foobar = ’{foo}{bar}’.format(foo=foo, bar=bar) # It is best
2.1.8 Vendorizing Dependencies
2.1.9 Runners
2.1.10 Further Reading
• http://docs.python.org/2/library/
• http://www.diveintopython.net/toc/index.html