简体   繁体   中英

Python 2.7 Global name not defined

Writing a python program to perform merge sort, and I get a Global Name not found error

### Program for Merge Sort ###
def merge(numbers, l, m, r):
    n1 = m-l-1 ### Size of the left side array ###
    n2 = r-l  ### Size of the right side array ###
    ### Temporary Lists ###
    for i in range(n1):
        L[i] = numbers[l+i]

    for j in range(n2):
        R[j] =  numbers[m+j+1]

    ### The following code eliminates searching if any of the lists have become empty ###
    L[n1] = float("inf")
    R[n1] = float("inf")

    i = 0
    j = 0

    for k in range(l,r+1):
        if(L[i]<=R[j]):
            numbers[k] = L[i]
            i+=1
        else:
            numbers[k] = R[j]
            j+=1

def mergeSort(numbers, l, r):
    if (l<r):
        m = l+(r-1)/2 ### Avoids overflow for large numbers
        mergeSort(numbers, l, m)
        mergeSort(numbers, m+1, r)
        merge(numbers, l, m, r)

I have my driver program calling the mergeSort function on the user input numbers and when I run the code, I get an error saying Global Name 'R' is not defined

Traceback (most recent call last):
  File "merge_sort.py", line 55, in <module>
    main()
  File "merge_sort.py", line 50, in main
    mergeSort(numbers, 0, size-1)
  File "merge_sort.py", line 32, in mergeSort
    mergeSort(numbers, l, m)
  File "merge_sort.py", line 33, in mergeSort
    mergeSort(numbers, m+1, r)
  File "merge_sort.py", line 34, in mergeSort
    merge(numbers, l, m, r)
  File "merge_sort.py", line 10, in merge
    R[j] =  numbers[m+j+1]
NameError: global name 'R' is not defined`

What am I doing wrong?

Indeed you never defined name R . Fix that by replacing:

for j in range(n2):
    R[j] =  numbers[m+j+1]

with:

R = [numbers[m+j+1] for j in range(n2)]

(and similarly for L , by the way -- I'm surprised you don't get that as an error since you access the name L before the name R ).

You need to initialize your temporary lists, L and R , before using them.

L = []
R = []
for i in range(n1):
    L[i] = numbers[l+i]

for j in range(n2):
    R[j] =  numbers[m+j+1]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM