Python: 将列表传递给另一个列表但列表为空
Python: pass list to another list but list is blank
我正在使用 python 3.7 和 openpyxl。我正在尝试将工作表中的数据解析为列表。在这个函数中,最初我是直接从一个电子表格中提取信息到一个列表中,然后使用 openpyxl 粘贴到另一个工作表中,但是我无法使用 excel 过滤器等,所以现在我试图编辑信息一个列表。问题是,当我尝试将信息解析到该列表时,它在 current_data 中显示正常,但是当我附加列表时,我得到了不同的信息,几乎就像它正在覆盖列表一样。请参阅下面的函数和输出。先感谢您。
def cut_sheet_up(wsn, nws, output_log):
x=0
ws = wb[wsn]
current_data = []
for rowOfCellObjects in ws.iter_rows(min_row=0, min_col=0):
current_data.clear()
for cellObj in rowOfCellObjects:
if cellObj.value is None:
current_data.append('')
# print causes ' value in front of string
elif isinstance(cellObj.value, datetime) or isinstance(cellObj.value, time):
current_data.append(cellObj.value)
else:
current_data.append(str(cellObj.value))
nws.append(current_data)
if wb[wsn] == wb['output_log']:
x+=1
print(current_data)
output_log.append(current_data)
else:
pass
前 150 行左右打印为 current_data 下的实际信息,其余行打印如下。
['foo', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
在工作表中,我将信息传递给 我也使用当前函数接收正确的数据。但是,当我在函数之后执行 print(output_log) 时,我得到所有 1500 行
['foo', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
如有任何帮助,我们将不胜感激。
您正在 for 循环中清除列表,这里没有必要重复使用相同的列表,因此只需在 for 循环中初始化它而不是清除它
for rowOfCellObjects in ws.iter_rows(min_row=0, min_col=0):
current_data = []
这是因为您在循环的每次迭代中重复使用同一个列表。
current_data.clear()
确实清除了列表,但这与之前附加的 reference 相同。
要解决您的问题,只需将 current_data = []
(第 4 行)移动到 for 循环内并删除 current_data.clear()
语句即可。
编辑:这里有一个简短的例子来说明 value 和 reference.
之间的区别
my_list = [] # my_list is a variable that is pointing to a list
other_list = my_list # other_list is a second variable that is pointing to the same list
my_list.append(1)
print(my_list) # Prints out "[1]"
print(other_list) # Also print out "[1]"
我们说两个变量引用同一个实例(列表)。如果我们将新列表分配给 my_list
:
会发生什么
my_list = []
print(my_list) # Prints out "[]"
print(other_list) # Still prints out "[1]"
他们现在指的是完全不同的列表。
与此相关的是 "pass by value" 和 "pass by reference" 的概念,您可能会发现了解这些概念很有用。
我正在使用 python 3.7 和 openpyxl。我正在尝试将工作表中的数据解析为列表。在这个函数中,最初我是直接从一个电子表格中提取信息到一个列表中,然后使用 openpyxl 粘贴到另一个工作表中,但是我无法使用 excel 过滤器等,所以现在我试图编辑信息一个列表。问题是,当我尝试将信息解析到该列表时,它在 current_data 中显示正常,但是当我附加列表时,我得到了不同的信息,几乎就像它正在覆盖列表一样。请参阅下面的函数和输出。先感谢您。
def cut_sheet_up(wsn, nws, output_log):
x=0
ws = wb[wsn]
current_data = []
for rowOfCellObjects in ws.iter_rows(min_row=0, min_col=0):
current_data.clear()
for cellObj in rowOfCellObjects:
if cellObj.value is None:
current_data.append('')
# print causes ' value in front of string
elif isinstance(cellObj.value, datetime) or isinstance(cellObj.value, time):
current_data.append(cellObj.value)
else:
current_data.append(str(cellObj.value))
nws.append(current_data)
if wb[wsn] == wb['output_log']:
x+=1
print(current_data)
output_log.append(current_data)
else:
pass
前 150 行左右打印为 current_data 下的实际信息,其余行打印如下。
['foo', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
在工作表中,我将信息传递给 我也使用当前函数接收正确的数据。但是,当我在函数之后执行 print(output_log) 时,我得到所有 1500 行
['foo', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
如有任何帮助,我们将不胜感激。
您正在 for 循环中清除列表,这里没有必要重复使用相同的列表,因此只需在 for 循环中初始化它而不是清除它
for rowOfCellObjects in ws.iter_rows(min_row=0, min_col=0):
current_data = []
这是因为您在循环的每次迭代中重复使用同一个列表。
current_data.clear()
确实清除了列表,但这与之前附加的 reference 相同。
要解决您的问题,只需将 current_data = []
(第 4 行)移动到 for 循环内并删除 current_data.clear()
语句即可。
编辑:这里有一个简短的例子来说明 value 和 reference.
之间的区别my_list = [] # my_list is a variable that is pointing to a list
other_list = my_list # other_list is a second variable that is pointing to the same list
my_list.append(1)
print(my_list) # Prints out "[1]"
print(other_list) # Also print out "[1]"
我们说两个变量引用同一个实例(列表)。如果我们将新列表分配给 my_list
:
my_list = []
print(my_list) # Prints out "[]"
print(other_list) # Still prints out "[1]"
他们现在指的是完全不同的列表。
与此相关的是 "pass by value" 和 "pass by reference" 的概念,您可能会发现了解这些概念很有用。