Python中的[0]*x语法有什么用?
我有个简单的问题,我在看下面的代码:
from __future__ import division
import math
import time
def dft(x, inverse = False, verbose = False) :
t = time.clock()
N = len(x)
inv = -1 if not inverse else 1
X =[0] * N
for k in xrange(N) :
for n in xrange(N) :
X[k] += x[n] * math.e**(inv * 2j * math.pi * k * n / N)
if inverse :
X[k] /= N
t = time.clock() - t
if verbose :
print "Computed","an inverse" if inverse else "a","DFT of size",N,
print "in",t,"sec."
return X
我想知道(我对Python不太了解):
- X =[0] * N 这一行是干嘛的?
- 为什么会有两个星号 ** 呢?
7 个回答
7
X =[0] * N
这段代码会生成一个大小为 N 的列表,里面的所有元素都是零。比如说,X = [0] * 8
就会生成一个大小为 8 的列表。这个列表的内容是:
X = [0, 0, 0, 0, 0, 0, 0, 0]可以用图示来表示,如下所示:
从技术上讲,这个列表的八个位置实际上都指向同一个对象。这是因为在 Python 中,列表是引用结构。
如果你尝试给列表中的某个位置赋一个新值,比如说 X[2] = 10
,这并不会改变原来那个整数的值。实际上,它会计算出一个新的整数,值是 10,然后把列表的第 2 个位置指向这个新计算出来的值。
图示表示如下:
**
是一个幂运算符,用来计算一个数字的幂。例如,5 ** 2
的结果是 25。
37
[0] * x
这个写法会生成一个包含 x
个元素的列表。所以,
>>> [ 0 ] * 5
[0, 0, 0, 0, 0]
>>>
要注意的是,这些元素都是指向同一个对象的。对于像整数这样的不可变对象来说,这样没问题,但对于像列表这样的可变对象就麻烦了。
>>> t = [[]] * 5
>>> t
[[], [], [], [], []]
>>> t[0].append(5)
>>> t
[[5], [5], [5], [5], [5]]
>>>
**
这个符号是用来表示幂运算的。
>>> 5 ** 2
25
22
这里展示了 x = [0] * n
的用法:
>>> [0]*10
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
它是把列表的元素“乘”了起来
>>> [1, 2, 3] * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]
**
是一个幂运算符
>>> 3**2
9
不过要小心,它在不同的情况下也可以表示 **kwargs,想了解更多可以查看这里 Python中正确使用 **kwargs 的方法