Python中的[0]*x语法有什么用?

26 投票
7 回答
59897 浏览
提问于 2025-04-16 17:39

我有个简单的问题,我在看下面的代码:

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
  1. X =[0] * N 这段代码会生成一个大小为 N 的列表,里面的所有元素都是零。比如说,X = [0] * 8 就会生成一个大小为 8 的列表。

    这个列表的内容是:
    X = [0, 0, 0, 0, 0, 0, 0, 0]

    可以用图示来表示,如下所示:

命令 [0] * 8 的结果

从技术上讲,这个列表的八个位置实际上都指向同一个对象。这是因为在 Python 中,列表是引用结构。

如果你尝试给列表中的某个位置赋一个新值,比如说 X[2] = 10,这并不会改变原来那个整数的值。实际上,它会计算出一个新的整数,值是 10,然后把列表的第 2 个位置指向这个新计算出来的值。

图示表示如下:

这里输入图片描述

  1. ** 是一个幂运算符,用来计算一个数字的幂。例如,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 的方法

撰写回答