'Wrong result on LeetCode problem due to Variable Scope (probably)

So I finished solving this problem on LeetCode : Convert a Decimal number into a Roman Numeral Convert a Decimal into a Roman Numeral, and the code that i wrote in Python works for the test cases they provide directly from the site, works in VS code, Jupyter Notebooks...

But upon trying to officially submit the code, it gives a wrong answer : Submit Wrong Answer

After some research, many many errors like these happen because people misuse global class variable like :

class DisjointSet:
    set = {}
    lst = []

And the good way is to do it like this :

class DisjointSet:
    # default constructor, init all member data.
    def __init__(self):
        self.sets = {}     # This is init for each test case.
        self.longest = 0   # This is init for each test case.

but the thing is in my code I'm doing something similar and i'm still getting the error:

class Solution(object):
    def __init__(self):
        self.Roman = []     # This is init for each test case.
        self.Declist = []   # This is init for each test case.
   
 def intToRoman(self, num):
        strDec = str(num)
        dico_regular = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
        dico_special = {4: 'IV', 9: 'IX', 40: 'XL', 90: 'XC', 400: 'CD', 900: 'CM'}
        keys = list(dico_regular.keys())
        values = list(dico_regular.values())

        '''This part under is just a way of putting, let's say 3724 in a list [3000, 700, 20, 4]'''
        for v,i in enumerate(strDec[::-1]):
            self.Declist.insert(0, int(i) * (10 ** v))
        
        #--------------------------------------------------------------------------------------
        for item in self.Declist:
            x = item
            if item in dico_special: 
                self.Roman.append(dico_special[item])
                continue
                
            if item > 1000 :
                self.Roman.append("M"* (item//1000))
                continue

            while x != 0:
                for i in range(1,len(values)):
                    if values[i-1] <= x < values[i]:
                        x -= values[i-1]
                        self.Roman.append(keys[i-1]) 

        return "".join(self.Roman)


Solution 1:[1]

As suggested by @ThierryLathuille you need to remove the references to self.Declist and self.Roman and make them local variables.

Copy/Paste this code to LeetCode

class Solution(object): 
    def intToRoman(self, num):
        Roman = [] 
        Declist = []
        
        strDec = str(num)
        dico_regular = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
        dico_special = {4: 'IV', 9: 'IX', 40: 'XL', 90: 'XC', 400: 'CD', 900: 'CM'}
        keys = list(dico_regular.keys())
        values = list(dico_regular.values())

        '''This part under is just a way of putting, let's say 3724 in a list [3000, 700, 20, 4]'''
        for v,i in enumerate(strDec[::-1]):
            Declist.insert(0, int(i) * (10 ** v))
        
        #--------------------------------------------------------------------------------------
        for item in Declist:
            x = item
            if item in dico_special: 
                Roman.append(dico_special[item])
                continue
                
            if item > 1000 :
                Roman.append("M"* (item//1000))
                continue

            while x != 0:
                for i in range(1,len(values)):
                    if values[i-1] <= x < values[i]:
                        x -= values[i-1]
                        Roman.append(keys[i-1]) 

        return "".join(Roman)

Then you can test that the code works doing:

a = Solution()
print(a.intToRoman(58))

and it correctly prints LVIII for 58

Solution 2:[2]

Yep, just found out the problem. First of all, I was submitting my answer in LeetCode under Python and not Python3, which is why I had all those weird errors, and Second of all, my solution had an error in it (Yes, i'm sorry @Thierry Lathuille, you were right in the end..) which was this line if item > 1000: which is supposed to be if item >= 1000: (to answer @Sembei Norimaki). So in the end my solution got submitted and alas everything ended well! also big thanks to everyone involved in this thread, you were great help!

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Sembei Norimaki
Solution 2