【问题标题】:Take a variable outside a loop to work with it在循环外取一个变量来使用它
【发布时间】:2020-11-05 00:48:33
【问题描述】:

我做了一个循环,它给了我很多文件路径(在一个列表中)。这些文件路径被分配给循环内名为 all_file_paths 的变量。

现在我打算用那个变量做很多代码,所以为了保持正确,我想把这个变量放在循环之外,并进一步使用它。因为如果我继续在那个循环中工作,循环会变得很大,事情可能会变得混乱。但正如您可能已经知道的那样,一旦我将变量置于循环之外,我就不再使用分配给该变量的相同内容。我只是得到一个空列表:(

将变量带出循环并像在循环内部一样使用它们是正确的方法吗?

这是我的代码示例,我想知道他们是否有技巧,这样我就可以为更大的脚本做同样的事情。谢谢。

source = r'c:\data\JS\Desktop\MyFolder'

for subdir in os.listdir(source):
    subdir_path = os.path.join(source, subdir)
#    print(subdir_path)
    
    all_file_paths = [os.path.join(subdir_path, file) for file in os.listdir(subdir_path)]
    all_file_paths = [p for p in all_file_paths if os.path.isfile(p)]
    print(all_file_paths) #<----- when I print this, I get what I need.
    
print(all_file_paths) #<-----when I print this I get an empty list.

【问题讨论】:

  • 即使在循环之外,您也应该在变量中获得相同的值。唯一的问题可能是如果您在函数内部运行for-loop 并尝试在函数外部使用变量,因为在函数内部它将创建与外部变量无关的局部变量。您应该在函数中使用return all_file_paths 并运行all_file_paths = function() - 所以问题与for-loop 无关,而是与function
  • all_file_paths 对于循环的每次迭代都会有一个不同的值。如果您在循环之后检查它,它将具有在循环的最终迭代期间具有的任何值;以前的所有值都消失了。您要么需要在循环内对这个变量做所有你需要做的事情,要么将它附加到一个列表中,以便在循环后获得所有可用的值。
  • @furas。所以你是说我必须发挥它的作用?但同样的问题仍然存在。因为我不能在函数外使用变量......
  • @jasonharper 将其附加在循环内部还是外部?
  • 如果您问这个问题,我认为您不理解我的评论。循环内部是唯一存在分配给all_file_paths 的所有各种值的地方。在循环之外,只有其中一个值仍然存在。

标签: python loops variables


【解决方案1】:

您的all_file_paths 只能保留上一个循环中的值,如果在最后一个循环中创建空列表,那么在for-loop 之后您将只有空列表。

您应该在for-loop 之前创建列表。在for-loop 里面你应该append() 或extend() 这个列表。

source = r'c:\data\JS\Desktop\MyFolder'

# -- before --

all_file_paths = []

# -- inside --

for subdir in os.listdir(source):
    subdir_path = os.path.join(source, subdir)
    
    results = [os.path.join(subdir_path, file) for file in os.listdir(subdir_path)]
    results = [p for p in results if os.path.isfile(p)]
    print('(partial) results:', results)

    all_file_paths.extend(results) # add to list

# --- after ---
    
print('(all) results:', all_file_paths) 

【讨论】:

  • 对我有用。谢谢,但是在循环之后仅使用列表进行编码真的很困难。
  • 有什么难的?这是自然的方法。如果您尝试将列表推导转换为普通的for-loop,那么您会得到类似的结果。如果你不想在循环之后使用,那么在for-loop 中使用部分results
猜你喜欢
  • 2014-09-05
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 1970-01-01
  • 2017-09-06
  • 1970-01-01
相关资源
最近更新 更多