【问题标题】:Python multiple variables on left side of assignment operator赋值运算符左侧的Python多个变量
【发布时间】:2016-08-20 11:40:12
【问题描述】:

有人能解释一下赋值运算符左侧的变量名称的逗号分隔链(可能不是正确的术语,但我不想将其与list 混淆)的概念吗?

我指的是以下性质的东西

reader = csv.reader(open('some_file', 'rb'))
for row in reader:
    k, v = row
    myDictionary[k] = v

我知道这个例子可能会导致'some_file'的格式问题,所以这是我遇到的另一个例子

username, password = sys.argv[1:]

我知道argv来自命令行,1:指的是python脚本名称后面的所有参数,但是用户名和密码如何获取正确的项目呢?换句话说,传递给这个程序的参数是由什么分隔的,仅仅是参数之间的空格吗?

参考第一个示例,假设row 是两列行,kv 如何从row 获取它们的值。那些使用逗号作为分隔符吗?

任何 Python 代码或文档的解释和/或链接都会很棒。

【问题讨论】:

  • 相关Python文档here

标签: python python-3.x


【解决方案1】:
k, v = row

username, password = sys.argv[1:]

sequence unpacking 的示例。序列解包要求赋值运算符左侧的变量数量与右侧的序列具有相同数量的元素。如果他们这样做,则将序列的第一个元素分配给第一个变量,将第二个分配给第二个,依此类推。如果它们不相等,则会抛出一个值错误。

str、unicode、list、tuple、bytearray、buffer、xrange都是合法的序列,可以用在操作符的右边。


剩下要了解的是 'row' 和 sys.argv[1:] 是否是具有 2 个元素的有效序列。

csv.reader() 将 csv 的每一行作为字符串的列表返回。所以它是一个有效的序列。如果 csv 有 2 列,则列表将有 2 个元素。默认情况下 csv.reader 使用逗号作为分隔符来分割。如果需要,您可以指定不同的分隔符:

csv.reader(csv_file, delimiter='|')

对于 Python 的每次调用,sys.argv 自动是一个字符串的列表,表示命令行上的参数(以空格分隔)。所以又是一个有效的序列。 argv[0] 始终是脚本名称。因此,如果用户使用 2 个参数运行程序,则用户名后跟密码 sys.argv[1:] 将是所需的 2 个元素的列表。

【讨论】:

    【解决方案2】:

    这与它的工作原理相同:

    a, b = [1, 2]
    

    a 分配给1,将b 分配给2

    这适用于您的 CSV 阅读器,因为您的文件必须有两列,第一个变量分配给该行的第一列,第二个变量分配给第二列。阅读器返回一个类似上面的列表,以便它工作的原因:)

    【讨论】:

      【解决方案3】:

      基本上csv reader 将每一行返回为list

      现在假设列表是a=[1,2,3] 如果你想通过分配应该是

      a1,a2,a3 = a
      

      并且解包值将像这样分配给变量

      a1=1 a2=2 a3=3

      左侧赋值变量的数字应该等于列表的长度。

      如果变量个数和列表长度不相等会报错

      ValueError:解包的值太多

      list 会将值作为索引解包,并将其从左到右分配给变量。

      现在让我们进入正题。 在csv reader 中,行是list type,这个列表的lengthcsv 文件列的数量。所以当你打开它时,你必须记住给出分配变量的数量。

      另一个sys.argv[] 也返回一个列表。

      最后一个csv 文件分隔符是comma(,),命令参数解析器分隔符是space(一个/多个),但解析后它们都返回一个list。因此,当我们尝试将其解压缩为多个分配变量时,我们必须考虑列表。

      【讨论】:

        【解决方案4】:

        左侧有一个变量的元组,右侧有一个值列表。每个变量都获得适当的值。 所以这个方法与字符串和任何值分隔符无关。关键字是 LIST。

        对于 csv 文件,您可以从 pydoc csv 在reader()的定义处:

        reader(...)
            csv_reader = reader(iterable [, dialect='excel']
                                    [optional keyword args])
                for row in csv_reader:
                    process(row)
        
            The "iterable" argument can be any object that returns a line
            of input for each iteration, such as a file object or a list.  The
            optional "dialect" parameter is discussed below.  The function
            also accepts optional keyword arguments which override settings
            provided by the dialect
        

        .

        【讨论】:

        • 这不是一个列表,而是一个没有被括号括起来的元组定义。请参阅上面的重磅链接。
        • 虽然你是对的,但我不认为 curran 处于他/她可以/必须知道列表和元组之间(轻微)差异的位置。
        • 更具体地说,row 是一个列表,如果它有 2 个值,则将这两个值复制到元组的两个值中,在这种情况下,它们是变量 k 和 v。
        • 感谢 Gombai 的回答,感谢 Phillip 的跟进。我倾向于倾向于菲利普在这个话题上的观点。我没有在我的问题中使用list 并特别指出我没有使用的原因是因为变量不在列表中。我真正希望找到的是 Phillip 所说的,这是一个没有被括号包围的元组定义。
        猜你喜欢
        • 2015-06-12
        • 2017-07-16
        • 2016-06-08
        • 1970-01-01
        • 2018-02-21
        • 2023-04-10
        • 2012-06-29
        • 2016-06-23
        相关资源
        最近更新 更多