【问题标题】:Global variables changed only in some cases [closed]全局变量仅在某些情况下更改[关闭]
【发布时间】:2017-02-22 10:40:22
【问题描述】:
def insertionSort(lst):
    #create variable to store final sorted list
    sortedLst = []
    #add any number into the list so the program can start inserting
    sortedLst.append(lst.pop())

    #for each item left over in the original list compare to sorted list
    for sortInd in range(len(lst)-1,-1,-1):
    #for each index to sort
        for sortingInd in range(len(sortedLst),-1,-1):
            if sortingInd == 0 or sortingInd == len(sortedLst):
                sortedLst.insert(sortingInd,lst.pop())
                break
            if lst[sortInd] > sortedLst[sortingInd]:
                sortedLst.insert(sortingInd,lst.pop())
                break

    print(sortedLst) #gives [1,2,3]
    print(lst) #gives []
    lst = sortedLst
    print(lst) #gives [1,2,3]

lst = [3,2,1]
insertionSort(lst)
#lst should be [1,2,3] yet gives []
print(lst)

我正在尝试编写一个插入排序,插入排序本身确实可以工作,但是因为这是我编写的更多排序的一部分,我特别不想在函数外部为排序列表声明一个新变量并拥有函数返回一个排序列表以与我的其他函数保持一致。例如我不想要:

lst = [3,2,1]
newLst = insertionSort(lst)

相反,我希望 insertSort 函数更改我原来的 lst 变量,当我弹出要排序的值时它确实会改变,但在函数结束之前将其设置为 sortedLst 时它不会改变。

提前感谢您的任何回答:)。

【问题讨论】:

  • Python 有很好的文档,这应该在execution model 部分解释。例如,函数内部的lst不是函数外部的lst,并且lst = x 不会复制x
  • 嗯,我明白这一点,为什么我的 lst 不会在我执行 'lst = sortedLst' 时更改为我的 sortedLst 但为什么 lst.pop() 实际上会从我的lst 在函数之外,而不仅仅是在函数内部?谢谢
  • 你知道名字、引用(指针)和值的区别吗?
  • 我很确定,引用指的是内存位置,值是存储在内存位置的东西,名称是对内存位置的引用的名称。如我错了请纠正我。我的问题现在已经在 Daniel Roseman 的答案中得到了回答。不过感谢您的帮助。

标签: python list python-3.x global-variables


【解决方案1】:

您根本不会在此处更改任何全局变量。

您可以通过在 insertionSort 函数中将 lst 声明为全局来解决此问题,但我不确定您为什么要这样做;最好直接返回 sortedLst 并打印出来。

【讨论】:

  • 我原来的 'lst = [3,2,1]' 是否因为它在最外层范围内声明而未被归类为全局变量。另外,我知道我可以返回我的 sortedLst,但我想知道为什么我的原始 lst 从 [3,2,1] 更改为 [] 但不是从 [] 更改为我的 sortedLst。感谢您的快速回复。
  • 否,因为该全局变量被函数本身中的lst 参数所遮蔽。碰巧它们最初指向同一个列表,这就是您的pop 起作用的原因;但是你通过重新分配本地名称lst 指向sortedLst 来打破它。如果你想保留参考,你可以做lst[:] = sortedLst
  • 我现在明白了。我知道有更好的方法来解决这个问题,但是我只是想了解为什么会这样。谢谢你:)
猜你喜欢
  • 2021-09-21
  • 1970-01-01
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
  • 2020-05-04
  • 2013-07-28
  • 2012-11-18
  • 2011-10-19
相关资源
最近更新 更多