2016-04-26 136 views
3

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

什么,我指的是以下性质

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代码或文档的任何解释和/或链接都会很棒。

+0

欢迎使用超级用户!这个问题是关于编程的,因此在这里是无关紧要的,但是应该非常适合堆栈溢出。请不要重复堆栈溢出问题,请将问题标记为请管理员为您移动它。 – heavyd

+2

相关的Python文档[这里](https://docs.python.org/2/tutorial/datastructures.html#tuples-and-sequences) – heavyd

+0

我不好,你绝对正确。感谢您对此的意见! – curran

回答

2
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个元素的列表。

-1

左侧有一个TUPLE变量,右侧有一个值列表。每个变量都会得到相应的值。 所以这个方法与字符串和任何值分隔符无关。关键字是LIST(s)。

至于CSV文件,你可以在读卡器(定义)得到 是pydoc CSV 的信息:

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 

+1

这不是一个列表,而是一个没有被圆括号包围的元组定义。请参阅上面来自heavyd的链接。 –

+0

虽然你是对的,但我不认为curran处于他/她可以/必须知道列表和元组之间(轻微)区别的位置。 –

+1

更具体地说,行是一个列表,如果它有2个值,那么将这两个值复制到一个元组的两个值中,在这种情况下,这些变量是变量k和v。 –

1

这适用于同样的原因,这个工程:

a, b = [1, 2] 

其中分配给a1b2

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

0

基本上csv reader回报每行作为一个list

现在假定一个清单a=[1,2,3] 如果你想通过分配,应该是

解压名单
a1,a2,a3 = a 

和拆包值将分配这样的可变

a1=1 a2=2 a3=3

the number left side assignment variable should be the equal of length of list.

如果变量和列表长度的数量是不相等的比你会得到一个错误

ValueError: too many values to unpack

和列表将解压的价值,因为它的指数,并为其分配左至右变量。

现在让我们来看看。 在csv reader的行是list type,而此列表的lengthcsv文件列的编号。所以,当你打开它时,你必须记住赋予赋值变量的数量。

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

而且最后csv文件分隔符为comma(,)和命令参数解析器分隔符为space(一个/多个),但分析后,他们都返回一个list。所以当我们试图解包它多个赋值变量时,我们必须考虑列表。