为什么我的Python参数没有解包?

为什么我的Python参数没有解包?,python,argument-passing,Python,Argument Passing,我有点困惑。我试图以编程方式创建XSL-FO文件,因此需要在文件中的某个位置插入数量可变的元素。当然,我可以用其他方法(XML/XSLT、其他XML方法等)来实现这一点,但我想知道为什么这样做不起作用,因为我对Python的基本知识可能有点生疏了。通过“Right HERE”,我试图将我的列作为可变数量的参数插入。请注意,这并不需要一个列表,如果我复制下一行(E(“table column…”)上的内容,它确实会一次又一次地产生所需的输出(多个table column元素。但是,通过解包,不管发

我有点困惑。我试图以编程方式创建XSL-FO文件,因此需要在文件中的某个位置插入数量可变的元素。当然,我可以用其他方法(XML/XSLT、其他XML方法等)来实现这一点,但我想知道为什么这样做不起作用,因为我对Python的基本知识可能有点生疏了。通过“Right HERE”,我试图将我的列作为可变数量的参数插入。请注意,这并不需要一个列表,如果我复制下一行(
E(“table column…”)上的内容,
它确实会一次又一次地产生所需的输出(多个
table column
元素。但是,通过解包,不管发生什么,它只会给我一个
table column
元素。发生了什么事

from lxml.builder import ElementMaker
from lxml import etree as ET  
COLUMNS = 8
E = ElementMaker(namespace='http://www.w3.org/1999/XSL/Format',
                 nsmap={'fo':"http://www.w3.org/1999/XSL/Format"})
column_elms = [E("table-column",{"column-width":"41mm"})] * COLUMNS
root = E("root",
         E("layout-master-set",
           E("simple-page-master",
             {"master-name":"label-sheet",
                "margin-left":"5mm",
                "margin-right":"5mm",
                "margin-top":"14mm",
                "margin-bottom":"14mm"},
             E("region-body"))),
         E("page-sequence",
           {"master-reference":"label-sheet"},
             E("flow", {"flow-name":"xsl-region-body"},
                E("table", *column_elms # **RIGHT HERE**
                                        # E("table-column",{"column-width":"41mm"}),
                    ))))

您正在创建一个包含相同对象的
副本的列表:

上面的代码没有调用
E()
8次,它只调用一次,然后在列表中放入8个引用

就好像你在跑:

column_elms = []
tcolumn = E("table-column",{"column-width":"41mm"})
for i in range(COLUMNS):
    column_elms.append(tcolumn)
改为使用列表:

column_elms = [E("table-column",{"column-width":"41mm"}) for _ in xrange(COLUMNS)]

它将为循环中的每次运行计算
E(..)
表达式。

您正在创建一个包含相同对象的
列的列表:

上面的代码没有调用
E()
8次,它只调用一次,然后在列表中放入8个引用

就好像你在跑:

column_elms = []
tcolumn = E("table-column",{"column-width":"41mm"})
for i in range(COLUMNS):
    column_elms.append(tcolumn)
改为使用列表:

column_elms = [E("table-column",{"column-width":"41mm"}) for _ in xrange(COLUMNS)]

这将为循环中的每次运行计算
E(…)
表达式。

一个未经测试的预感:尝试将
column_elms=[E(“table column”,“column width:“41mm”)替换为
column_elms=[E(“table column”,“column width:“41mm”)来表示范围(COLUMNS)]
?@Dougal:Tested,它可以工作。(我猜它在某个时候会变成一个集合或一个字典,这意味着子类的重复实例将只计算一次)。你应该作为答案发布。@Dougal-这确实有效,谢谢。结果表明,将它们相乘会产生完全相同的元素(在相同的地址)一个未经测试的预感:尝试用
column_elms=[E(“table column”,“column width:“41mm”)]替换
column_elms=[E(“table column”,“column width:“41mm”)作为范围内(COLUMNS)]
?@Dougal:测试过,它可以工作。(我猜它在某个时候会变成一个集合或一本字典,这意味着重复的儿童实例将只计算一次)。你应该作为答案发布。@Dougal-这确实有效,谢谢。结果是将它们相乘会产生完全相同的元素(在相同的地址)。请回答,我将其标记为答案。