簡體   English   中英

在不使用全局關鍵字的情況下更改函數中的全局變量

[英]Changing a global variable in a function without using global keyword

教科書中的代碼屏幕截圖

這是我的代碼:

def L_value_Change(k):
    global L
    L = k
    return L

def  applyF_filterG(L, f, g):
    L
    k = []
    for i in L:
       if g(f(i)):
          k.append(i)
    L = k
    L_value_Change(k)
    if L == []:
        return -1
    else :
        return max(L)

當我輸入此代碼時,評分員告訴我這是不正確的! 因此,我閱讀了測驗的簡介,講師寫了“全局變量不起作用”。 如何在不使用單詞global情況下使用函數更改L變量? 如果您嘗試我的代碼並提供所需的輸入,它將為您提供正確的答案,但評分員告訴我這是錯誤的。

要將全局變量重新綁定到其他對象時,需要使用global關鍵字。 但是,如果您要做的只是更改可變對象,則不需要它。 在您的情況下, L是一個列表,可以使用切片操作L[:] = k進行適當地突變。 展示:

>>> L = [1,2,3]
>>> 
>>> def L_value_Change(k):
...     L[:] = k
... 
>>> old_id = id(L)
>>> L
[1, 2, 3]
>>> L_value_Change([4,5,6])
>>> assert id(L) == old_id
>>> L
[4, 5, 6]
>>> 

列表是可變的對象,因此,要更改它們,只需將它們作為函數的參數傳遞即可。

def f(i):
    return i + 2

def g(i):
    return i > 5

l = [0, -10, 5, 6, -4]
def applyF_filterG(L, f, g):
    for val in L[:]:
        if not g(f(val)):
            L.remove(val)
    return -1 if not L else max(L)      

print(l) # [0, -10, 5, 6, -4]
applyF_filterG(l, f, g) # Return 6
print(l) # [5, 6]

這是我的代碼,可避免在您要迭代的列表上進行變異。

def applyF_filterG(L,f,g):
        """
        Assumes L is a list of integers
        Assume functions f and g are defined for you. 
        f takes in an integer, applies a function, returns another integer 
        g takes in an integer, applies a Boolean function, 
            returns either True or False
        Mutates L such that, for each element i originally in L, L contains  
            i if g(f(i)) returns True, and no other elements
        Returns the largest element in the mutated L or -1 if the list is empty
        """
        # Applying the functions & Mutating L
        i = len(L)-1
        largestnum=0  
        if (len(L)==0):
            return -1
        else:
            while i>=0:
                if not g(f(L[i])):
                   del L[i]
                i-=1    

        #Finding the largest number
        if not L:
            return -1
        if (len(L)==1):
            return L[0]
        else:
            for num in range(len(L)-1):
                if (L[num]>L[num+1]):
                    largestnum=L[num]
                else:
                    largestnum=L[num+1]
            return largestnum    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM